﻿// Best Cow Line POJ - 3617.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <string>


using namespace std;
//https://vjudge.csgrandeur.cn/problem/POJ-3617

/*
FJ即将带着他的N头奶牛（1 ≤ N ≤ 2,000）参加每年一次的“年度农夫”比赛。
在这个比赛中，每个农民都会将他的奶牛排成一排，并引导它们经过评委。

今年的比赛组织者采用了一种新的注册方案：只需按照奶牛出现的顺序注册每头奶牛的首字母
（例如，如果FJ按照Bessie、Sylvia和Dora的顺序带走它们，他只需注册BSD）。
注册阶段结束后，每个小组按照奶牛名字首字母的字典顺序递增进行评判。

FJ今年非常忙，必须赶回自己的农场，所以他希望尽早接受评判。
他决定在注册之前重新排列已经站好队的奶牛。

FJ标记了一个供竞争奶牛排队的新位置。然后，他通过反复将原始队列中的第一头或最后一头奶牛送到新队列的末尾来组织奶牛。
完成后，FJ按照这个新顺序带着奶牛进行注册。

给定他的奶牛的初始顺序，确定他可以通过这种方式形成的最小字典序字符串。

输入：

第1行：一个整数N（1 ≤ N ≤ 2,000）
第2行到第N+1行：第i+1行包含原始队列中第i个位置上的牛的首字母（'A'..'Z'）
输出：
通过重新排列已经排好队的牛，可以得到的最小字典序字符串。
每一行（除了可能的最后一行）包含新队伍中80头牛（'A'..'Z'）的首字母。

6
A
C
D
B
C
B


ABCBCD


90
A
C
D
B
C
B
A
C
D
B
C
B
A
C
D
B
C
B
A
C
D
B
C
B
A
C
D
B
C
B
A
C
D
B
C
B
A
C
D
B
C
B
A
C
D
B
C
B
A
C
D
B
C
B
A
C
D
B
C
B
A
C
D
B
C
B
A
C
D
B
C
B
A
C
D
B
C
B
A
C
D
B
C
B
A
C
D
B
C
B

*/

const int N = 2010;
char str[N];
int n;
string ans;
int l, r;

void solveInner() {
	if (l == r) {
		ans.push_back(str[l]); l++; return;
	}
	int cpl = l; int cpr = r;
	while (cpl < cpr && str[cpl] == str[cpr]) {
		cpl++; cpr--;
	}
	if (cpl >= cpr || str[cpl] < str[cpr]) {
		ans.push_back(str[l]); l++; return;
	}
	else if (str[cpr] < str[cpl]) {
		ans.push_back(str[r]); r--; return;
	}
}

void solve() {
	l = 1; r = n;
	while (l <= r) {
		if (str[l] < str[r]) {
			ans.push_back(str[l]); l++;
		}
		else if (str[r] < str[l]) {
			ans.push_back(str[r]); r--;
		}
		else {
			solveInner();
		}
	}

	for (int i = 0; i < ans.size(); i++) {
		if (i != 0 && i % 80 == 0) {
			cout << endl;  
		}
		cout << ans[i];
	}
}


int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> str[i];
	}

	solve();

	return 0;
}

 